package cn.vehicle.utils;

import cn.hutool.core.util.StrUtil;
import cn.vehicle.enums.NvrTypeEnum;
import cn.vehicle.enums.StringTemplateEnum;
import cn.vehicle.service.config.SystemConfig;
import cn.vehicle.service.config.SystemConfigService;
import com.alibaba.fastjson2.JSONObject;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;


/**
 * NVR 工具类
 * <p>
 * 用于根据不同的 NVR 类型动态拼接 RTSP/回放流地址。
 * 支持实时视频流与录像回放两种模式。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>根据系统配置加载 NVR 类型、用户名、密码等信息；</li>
 *   <li>拼接 NVR 地址模板；</li>
 *   <li>根据时间参数判断实时流或回放流。</li>
 * </ul>
 */
@Component
public class NvrUtil {

    @Resource
    private SystemConfigService systemConfigService;

    /**
     * 获取 NVR 视频流地址
     * <p>
     * 根据传入的通道号、NVR 地址及时间参数，生成 RTSP 地址。
     * 若 startTime 与 endTime 均不为空，则为回放流；否则为实时流。
     * </p>
     *
     * @param channelCode 通道号，用于区分摄像头
     * @param nvrAddress  NVR 设备 IP 或域名地址
     * @param startTime   回放起始时间（为空表示实时流）
     * @param endTime     回放结束时间（为空表示实时流）
     * @return 拼接好的 RTSP 地址字符串
     */
    public String getNvrUrl(String channelCode, String nvrAddress, String startTime, String endTime) {

        // 组装模板参数：包含通道号、主机地址、起止时间、NVR 账号信息
        JSONObject jsonObject = new JSONObject()
                .fluentPut("channel", channelCode)
                .fluentPut("host", nvrAddress)
                .fluentPut("startTimeUTC", startTime)
                .fluentPut("endTimeUTC", endTime)
                // 标准化时间格式（将 t/z 替换为 ISO8601 格式）
                .fluentPut("startTimeUTC", StrUtil.isNotEmpty(startTime) ? "" : startTime.replace("t", "T").replace("z", "Z"))
                .fluentPut("endTimeUTC", StrUtil.isNotEmpty(endTime) ? "" : endTime.replace("t", "T").replace("z", "Z"))
                .fluentPut("username", systemConfigService.get(SystemConfig.nvrUsername))
                .fluentPut("pwd", systemConfigService.get(SystemConfig.nvrPassword));

        // 从系统配置中读取当前使用的 NVR 类型（如大华、海康等）
        NvrTypeEnum nvrTypeEnum = NvrTypeEnum.valueOf(systemConfigService.get(SystemConfig.systemNvrType));

        String nulUrl;

        // 判断是否为回放模式（startTime 和 endTime 都存在）
        if (StrUtil.isNotEmpty(startTime) && StrUtil.isNotEmpty(endTime)) {
            // 获取对应的 RTSP 模板地址（回放）
            nulUrl = nvrTypeEnum.getRtspNvrUrlInfo().getReplayUrl();
        } else {
            // 获取对应的 RTSP 模板地址（实时）
            nulUrl = nvrTypeEnum.getRtspNvrUrlInfo().getLiveUrl();
        }

        // 使用模板替换工具，将占位符替换为具体参数，返回完整的 RTSP URL
        return StringTemplateEnum.bracket.replace(nulUrl, jsonObject);
    }
}
